package ve.usb.crm;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.crm.hibernate.*;

import java.util.List;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.hibernate.sql.Update;
import ve.usb.cohesion.runtime.Pair;

/**
 * 
 */
public class AccionesOportunidad extends CohesionAction {

    /**
     * Called by Struts for the execution of action APreOportunidades.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreOportunidades(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VOportunidades",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            // Saco las oportunidades con sus cuentas asociadas para ser mostradas

            List<Oportunidad> oportunidad = (List<Oportunidad>) s.createQuery("from Oportunidad where esActivo = true and concretado = false").list();
            for (Oportunidad op : oportunidad) {
                Cuenta cu = (Cuenta) s.load(Cuenta.class, op.getCuenta().getIdCuenta());
                cu.getIdCuenta();
                cu.getNombre();
            }
            request.setAttribute("L_Oportunidad", oportunidad);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreCrearOportunidad.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreCrearOportunidad(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearOportunidad",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            FCrearOportunidad fFCrearOportunidad = FCrearOportunidad.clear(mapping, request);

            Long idCuenta = lookup_long(request, "idCuenta");


            cargarCollection(fFCrearOportunidad, s);

            if(idCuenta != null) {
                
                fFCrearOportunidad.setCuenta(idCuenta);
            }

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action ACrearOportunidad.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward ACrearOportunidad(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreOportunidades", "VCrearOportunidad",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearOportunidad fFCrearOportunidad = (FCrearOportunidad) form;


            //Saco los productos de el request

            String msgError = "<span class='ui-icon ui-icon-alert' style='float: left;'></span> Alert: <div>";
            Boolean hayError = false;
            List<ProductosCantidad> L_Productos = new ArrayList<ProductosCantidad>();
            Enumeration<String> nombres = request.getParameterNames();
            Pattern patron = Pattern.compile("cantidad_\\d+");
            List<String> cantidades = new ArrayList<String>();
            while (nombres.hasMoreElements()) {
                String tmp = nombres.nextElement();
                Matcher match = patron.matcher(tmp);

                if (match.find()) {
                    cantidades.add(tmp);
                }
            }

            String size = "cantidad_";
            boolean error = false;
            for (Iterator<String> it = cantidades.iterator(); it.hasNext();) {
                String string = it.next();
                int cantidad = Integer.parseInt(request.getParameter(string));
                Long catalogo = Long.parseLong(string.substring(size.length(), string.length()));

                Catalogo producto = (Catalogo) s.load(Catalogo.class, catalogo);
                ProductosCantidad prodC = new ProductosCantidad();
                prodC.setProducto(producto);
                prodC.setCantidad(cantidad);
                L_Productos.add(prodC);
                if (producto.getCantidad() < cantidad) {
                    error = true;
                    request.setAttribute("producto_" + producto.getIdCatalogo() + "Error", "Ahi un error en la cantidad");
                }

            }

            //Manejo de Errores
            //Error de cantidad
            if (error) {
                msgError += "Algun producto tiene mayor cantidad que la disponible<br>";
                hayError = true;

            }


            if (fFCrearOportunidad.getNombre().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("nombreError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un nombre v&aacute;lido");
            }

            if (fFCrearOportunidad.getTipo().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("tipoError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un tipo v&aacute;lido");
            }

            if (fFCrearOportunidad.getOrigenCampanya().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("origenCampanyaError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un origen v&aacute;lido");
            }

            if (fFCrearOportunidad.getEtapa() == 0) {
                hayError = true;
                request.setAttribute("etapaError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe seleccionar una etapa v&aacute;lida");
            }

            if (fFCrearOportunidad.getProbabilidad() < 0) {
                hayError = true;
                request.setAttribute("probabilidadError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe seleccionar una probabilidad positiva");
            }

            if (fFCrearOportunidad.getCuenta() == 0) {
                hayError = true;
                request.setAttribute("cuentaError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe seleccionar una cuenta v&aacute;lida");
            }

            if (fFCrearOportunidad.getRespOportunidad() == 0) {
                hayError = true;
                request.setAttribute("respOportunidadError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe seleccionar un responsable v&aacute;lido");
            }

            if (fFCrearOportunidad.getFechaCierre().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("fechaCierreError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe seleccionar una fecha v&aacute;lida");
            }

            if (hayError) {
                cargarCollection(fFCrearOportunidad, s);
                msgError += "</div>";
                request.setAttribute("msg", msgError);
                request.setAttribute("L_Productos", L_Productos);
                salida = SALIDA_1;
            } else {

                Oportunidad oportunidad = new Oportunidad();
                oportunidad.setNombre(fFCrearOportunidad.getNombre());
                oportunidad.setTipo(fFCrearOportunidad.getTipo());
                oportunidad.setOrigenCampanya(fFCrearOportunidad.getOrigenCampanya());
                if (!fFCrearOportunidad.getFechaCierre().equals("")) {
                    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                    oportunidad.setFechaCierre(df.parse(fFCrearOportunidad.getFechaCierre()));
                } //else oportunidad.setFechaCierre(null);
                oportunidad.setEtapa((Categoria) s.load(Categoria.class, fFCrearOportunidad.getEtapa()));
                oportunidad.setProbabilidad(fFCrearOportunidad.getProbabilidad());
                oportunidad.setImporte(fFCrearOportunidad.getImporte());
                oportunidad.setOrigenCandidato(fFCrearOportunidad.getOrigenCandidato());
                oportunidad.setDescripcion(oportunidad.getDescripcion());
                oportunidad.setCuenta((Cuenta) s.load(Cuenta.class, fFCrearOportunidad.getCuenta()));
                oportunidad.setRespOportunidad((Personal) s.load(Personal.class, fFCrearOportunidad.getRespOportunidad()));
                oportunidad.setProbabilidad(fFCrearOportunidad.getProbabilidad());
                oportunidad.setEsActivo(true);

                if (fFCrearOportunidad.getIdOportunidad() == 0) {
                    s.save(oportunidad);
                } else {
                    oportunidad.setIdOportunidad(fFCrearOportunidad.getIdOportunidad());
                    s.update(oportunidad);
                }


                Presupuesto presupuesto = (Presupuesto) s.createQuery("from Presupuesto where oportunidadPresupuesto = :oportunidad").setLong("oportunidad", oportunidad.getIdOportunidad()).uniqueResult();

                if (presupuesto == null) {
                    presupuesto = new Presupuesto();
                    presupuesto.setOportunidadPresupuesto(oportunidad);
                    s.save(presupuesto);
//                        s.flush();
                }

                List<PresupuestoCatalogo> LPresupuestoCatalogoActual = (List<PresupuestoCatalogo>) s.createQuery("from PresupuestoCatalogo where idPresupuesto = :idPresupuesto").setLong("idPresupuesto", presupuesto.getIdPresupuesto()).list();

                for (Iterator<String> it = cantidades.iterator(); it.hasNext();) {
                    String string = it.next();
                    int cantidad = Integer.parseInt(request.getParameter(string));
                    Long catalogo = Long.parseLong(string.substring(size.length(), string.length()));


                    Catalogo producto = (Catalogo) s.load(Catalogo.class, catalogo);
                    PresupuestoCatalogo productoFactura = new PresupuestoCatalogo();

                    if (LPresupuestoCatalogoActual != null) {
                        for (Iterator<PresupuestoCatalogo> it1 = LPresupuestoCatalogoActual.iterator(); it1.hasNext();) {
                            PresupuestoCatalogo presupuestoCatalogo = it1.next();
                            if (presupuestoCatalogo.getIdCatalogo().getIdCatalogo() == producto.getIdCatalogo()) {
                                productoFactura = presupuestoCatalogo;
                                LPresupuestoCatalogoActual.remove(presupuestoCatalogo);
                                break;
                            }


                        }
                    }

                    productoFactura.setCantidad(cantidad);
                    productoFactura.setIdCatalogo(producto);
                    productoFactura.setIdPresupuesto(presupuesto);

                    s.save(productoFactura);
//                        s.flush();


                }


                request.setAttribute("IdOportunidad", oportunidad.getIdOportunidad());
            }
            tr.commit();

        } catch (Exception ex) {

            tr.rollback();

            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreOportunidad.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreOportunidad(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VOportunidad",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            FCrearComentario fFCrearComentario = new FCrearComentario();
            Long idOportunidad = (Long) sess.getAttribute("idOportunidad");
            if (idOportunidad == null) {
                idOportunidad = (Long) request.getAttribute("idOportunidad");
            }
            if (idOportunidad == null) {
                idOportunidad = new Long(request.getParameter("idOportunidad"));
            }

            Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, idOportunidad);
            oportunidad.getEtapa().getNombre();
            if (oportunidad.getCuenta() != null) {
                Cuenta cuenta = (Cuenta) s.load(Cuenta.class, oportunidad.getCuenta().getIdCuenta());
                Hibernate.initialize(cuenta);
                request.setAttribute("Cuenta", cuenta);
            }
            if (oportunidad.getRespOportunidad() != null) {
                Personal personal = (Personal) s.load(Personal.class, oportunidad.getRespOportunidad().getIdPersonal());
                Hibernate.initialize(personal);
                request.setAttribute("Personal", personal);
            }

            List<Documento> documento = (List<Documento>) s.createQuery("from Documento where esProyecto = false and asociadoA =:idOportunidad").setLong("idOportunidad", oportunidad.getIdOportunidad()).list();

            Categoria cate = (Categoria) s.createQuery("from Categoria where nombre = :cat").setString("cat", "Oportunidad").uniqueResult();
            fFCrearComentario.setCategoria(cate.getIdCategoria());
            fFCrearComentario.setAsociadoA(idOportunidad);

            List<Comentario> comentarios = (List<Comentario>) s.createQuery("from Comentario where asociadoA = :idOportunidad and categoria = :idCategoria").setLong("idOportunidad", idOportunidad).setLong("idCategoria", cate.getIdCategoria()).list();

            for (Comentario c : comentarios) {
                c.getPersonal().getNombre();
            }

            Presupuesto presupuesto = (Presupuesto) s.createQuery("from Presupuesto where oportunidadPresupuesto = :oportunidad").setLong("oportunidad", oportunidad.getIdOportunidad()).uniqueResult();

            List<PresupuestoCatalogo> productos = (List<PresupuestoCatalogo>) s.createQuery("from PresupuestoCatalogo where idPresupuesto = :idPresupuesto").setLong("idPresupuesto", presupuesto.getIdPresupuesto()).list();

            for (Iterator<PresupuestoCatalogo> it = productos.iterator(); it.hasNext();) {
                PresupuestoCatalogo presupuestoCatalogo = it.next();
                Hibernate.initialize(presupuestoCatalogo.getIdCatalogo());
            }



            sess.setAttribute("FCrearComentario", fFCrearComentario);

            request.setAttribute("presupuesto", presupuesto);
            request.setAttribute("productos", productos);
            request.setAttribute("L_Comentarios", comentarios);
            request.setAttribute("L_Documentos", documento);
            request.setAttribute("Oportunidad", oportunidad);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action AEliminarOportunidad.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward AEliminarOportunidad(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreOportunidades",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            Long idOportunidad = (Long) sess.getAttribute("idOportunidad");
            if (idOportunidad == null) {
                idOportunidad = (Long) request.getAttribute("idOportunidad");
            }
            if (idOportunidad == null) {
                idOportunidad = new Long(request.getParameter("idOportunidad"));
            }

            List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where oportunidadrelacionada = :resp").setLong("resp", idOportunidad).list();
            for (Tarea t : tarea) {
                t.setEsActivo(false);
                s.update(t);
                s.flush();
            }
            Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, idOportunidad);
            oportunidad.setEsActivo(false);
            s.update(oportunidad);
            s.flush();

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreEditarOportunidad.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreEditarOportunidad(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VEditarOportunidad",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            Long idOportunidad = (Long) sess.getAttribute("idOportunidad");
            if (idOportunidad == null) {
                idOportunidad = (Long) request.getAttribute("idOportunidad");
            }
            if (idOportunidad == null) {
                idOportunidad = new Long(request.getParameter("idOportunidad"));
            }

            FCrearOportunidad fFCrearOportunidad = new FCrearOportunidad();

            Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, idOportunidad);

            cargarCollection(fFCrearOportunidad, s);

            fFCrearOportunidad.setIdOportunidad(idOportunidad);
            fFCrearOportunidad.setNombre(oportunidad.getNombre());
            fFCrearOportunidad.setTipo(oportunidad.getTipo());
            fFCrearOportunidad.setOrigenCampanya(oportunidad.getOrigenCampanya());
            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            fFCrearOportunidad.setFechaCierre(df.format(oportunidad.getFechaCierre()));
            fFCrearOportunidad.setEtapa(oportunidad.getEtapa().getIdCategoria());
            fFCrearOportunidad.setProbabilidad(oportunidad.getProbabilidad());
            fFCrearOportunidad.setImporte(oportunidad.getImporte());
            fFCrearOportunidad.setOrigenCandidato(oportunidad.getOrigenCandidato());
            fFCrearOportunidad.setDescripcion(oportunidad.getDescripcion());
            fFCrearOportunidad.setCuenta(oportunidad.getCuenta().getIdCuenta());
            fFCrearOportunidad.setRespOportunidad(oportunidad.getRespOportunidad().getIdPersonal());


            Presupuesto presupuesto = (Presupuesto) s.createQuery("from Presupuesto where oportunidadPresupuesto = :oportunidad").setLong("oportunidad", oportunidad.getIdOportunidad()).uniqueResult();

            List<PresupuestoCatalogo> productos = (List<PresupuestoCatalogo>) s.createQuery("from PresupuestoCatalogo where idPresupuesto = :idPresupuesto").setLong("idPresupuesto", presupuesto.getIdPresupuesto()).list();
            List<ProductosCantidad> L_Productos = new ArrayList<ProductosCantidad>();
            
            for (Iterator<PresupuestoCatalogo> it = productos.iterator(); it.hasNext();) {

                PresupuestoCatalogo presupuestoCatalogo = it.next();
                Hibernate.initialize(presupuestoCatalogo.getIdCatalogo());
                
                ProductosCantidad tmp = new ProductosCantidad();
                tmp.setCantidad(presupuestoCatalogo.getCantidad());
                tmp.setProducto(presupuestoCatalogo.getIdCatalogo());
                L_Productos.add(tmp);
                
            }


            
            sess.setAttribute("FCrearOportunidad", fFCrearOportunidad);
            request.setAttribute("Oportunidad", oportunidad);
            request.setAttribute("L_Productos", L_Productos);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward AFacturarPresupuesto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VFacturarPresupuesto", "VHome"};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            FFacturacion fFacturacion = (FFacturacion) form;
            //Saco los productos de el request

            String msgError = "<span class='ui-icon ui-icon-alert' style='float: left;'></span> Alert: <div>";
            Boolean hayError = false;
            List<ProductosCantidad> L_Productos = new ArrayList<ProductosCantidad>();
            Enumeration<String> nombres = request.getParameterNames();
            Pattern patron = Pattern.compile("check_\\d+");
            List<String> cantidades = new ArrayList<String>();
            while (nombres.hasMoreElements()) {
                String tmp = nombres.nextElement();
                Matcher match = patron.matcher(tmp);

                if (match.find()) {
                    cantidades.add(tmp);
                }
            }

            List<ProductosCantidad> productosAFacturar = new ArrayList<ProductosCantidad>();
            String size = "check_";
            boolean error = false;
            for (Iterator<String> it = cantidades.iterator(); it.hasNext();) {
                String string = it.next();
                Boolean isFacturar = Boolean.parseBoolean(request.getParameter(string));
                Long catalogo = Long.parseLong(string.substring(size.length(), string.length()));

                String cantidadS = "cantidad_" + catalogo;
                Integer cantidad = Integer.parseInt(request.getParameter(cantidadS));

                cantidadS = "cantidaddisp_" + catalogo;
                Integer cantidaddisp = Integer.parseInt(request.getParameter(cantidadS));
                Catalogo producto = (Catalogo) s.load(Catalogo.class, catalogo);

                if (isFacturar) {

                    if (cantidaddisp >= cantidad) {
                        ProductosCantidad productoC = new ProductosCantidad();
                        productoC.setProducto(producto);
                        productoC.setCantidad(cantidad);
                        productosAFacturar.add(productoC);
                    } else {
                        error = true;
                        request.setAttribute("producto_" + producto.getIdCatalogo() + "Error", "Ahi un error en la cantidad");
                    }


                }
            }

            if (error) {
                msgError += "Algun producto tiene mayor cantidad que la disponible<br>";
                hayError = true;

            }

            //Error de Nombre Vacio
            if (fFacturacion.getNombre().compareTo("") == 0) {
                msgError += "El nombre es requerido<br>";
                hayError = true;
                request.setAttribute("nombreError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>El nombre es requerido");
            }

            //Error de rif o cedula
            if (fFacturacion.getRifCedula().compareTo("") == 0) {
                msgError += "El rif es un campo requerido<br>";
                hayError = true;
                request.setAttribute("rifError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>El Rif es un campo requerido");
            }

            //Error de Direccion
            if (fFacturacion.getDireccion().compareTo("") == 0) {
                msgError += "La direccion es requerido<br>";
                hayError = true;
                request.setAttribute("direccionError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>La Direccion es requerida");
            }


            if (hayError) {
                msgError += "</div>";
                request.setAttribute("msg", msgError);
                request.setAttribute("L_Productos", L_Productos);
                salida = SALIDA_1;
            } else {

                //            Genero la factura

                Factura factura = new Factura();

                factura.setDireccion(fFacturacion.getDireccion());
                factura.setNombre(fFacturacion.getNombre());
                factura.setRazonSocial(fFacturacion.getRazon_Social());
                factura.setRifCedula(fFacturacion.getRifCedula());
                factura.setTelefono(fFacturacion.getTelefono());

                s.save(factura);
                s.flush();


                for (Iterator<String> it = cantidades.iterator(); it.hasNext();) {
                    String string = it.next();
                    int cantidad = Integer.parseInt(request.getParameter(string));
                    Long catalogo = Long.parseLong(string.substring(size.length(), string.length()));
                    FacturaCatalogo productoFactura = new FacturaCatalogo();

                    Catalogo producto = (Catalogo) s.load(Catalogo.class, catalogo);
                    productoFactura.setCantidad(cantidad);
                    productoFactura.setIdCatalogo(producto);
                    productoFactura.setIdFactura(factura);

                    s.save(productoFactura);
                    s.flush();

                    producto.setCantidad(producto.getCantidad() - cantidad);
                    s.save(producto);
                    s.flush();
                }


            }

            request.setAttribute("L_Productos", productosAFacturar);

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreFacturarPresupuesto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VFacturarPresupuesto",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            FFacturacion fFacturacion = FFacturacion.clear(mapping, request);


            //Obtengo el id cde la cuenta del request asi este como atributo o como parametro
            Long idOportunidad = (Long) request.getAttribute("idOportunidad");
            if (idOportunidad == null) {
                idOportunidad = lookup_Long(request, "idOportunidad");
            }

            //Saco la factura de la base de datos
            Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, idOportunidad);

            Presupuesto presupuesto = (Presupuesto) s.createQuery("from Presupuesto where oportunidadPresupuesto = :idOportunidad").setLong("idOportunidad", idOportunidad).uniqueResult();

            List<PresupuestoCatalogo> L_PresupuestoCatalogo = (List<PresupuestoCatalogo>) s.createQuery("from PresupuestoCatalogo where idPresupuesto = :idPresupuesto").setLong("idPresupuesto", presupuesto.getIdPresupuesto()).list();

            for (Iterator<PresupuestoCatalogo> it = L_PresupuestoCatalogo.iterator(); it.hasNext();) {
                PresupuestoCatalogo presupuestoCatalogo = it.next();

                Hibernate.initialize(presupuestoCatalogo.getIdCatalogo());
            }

            fFacturacion.setNombre(oportunidad.getNombre());


            request.setAttribute("oportunidad", oportunidad);
            request.setAttribute("presupuesto", presupuesto);
            request.setAttribute("L_Productos", L_PresupuestoCatalogo);


            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    private void cargarCollection(FCrearOportunidad fFCrearOportunidad, Session s) {
        // Creo la lista de las etapas de una oportunidad desde Categorias para ser mostradas en el formulario
        Categoria cat = (Categoria) s.createQuery("from Categoria c where c.nombre =:clas").setString("clas", "etapa").uniqueResult();
        List<Pair> list = (List<Pair>) s.createQuery("select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) from Categoria c where c.tipo =:cla").setLong("cla", cat.getId()).list();
        list.add(0, new Pair("Seleccione...", 0));
        fFCrearOportunidad.setListCategoria(list);

        // Creo la lista de las cuentas a la cual puede ser asociada una oportunidad
        // para ser mostradas en el formulario
        List<Cuenta> cuenta = (List<Cuenta>) s.createQuery("from Cuenta").list();
        list = new ArrayList<Pair>();
        for (Cuenta cu : cuenta) {
            list.add(new Pair(cu.getNombre(), cu.getIdCuenta()));
        }
        list.add(0, new Pair("Seleccione...", 0));
        fFCrearOportunidad.setListCuenta(list);

        // Creo la lista del personal responsable a la oportunidad
        // para ser mostrados en el formulario
        List<Personal> personal = (List<Personal>) s.createQuery("from Personal").list();
        list = new ArrayList<Pair>();
        for (Personal pe : personal) {
            list.add(new Pair(pe.getNombre(), pe.getIdPersonal()));
        }
        list.add(0, new Pair("Seleccione...", 0));
        fFCrearOportunidad.setListPersonal(list);
    }
}
